package com.ddzh.web;

import com.ddzh.entity.Result;
import com.ddzh.utils.RedisUtil;
import com.ddzh.utils.UploadUtils;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.concurrent.TimeUnit;

/**
 * 文件上传
 */
@RestController
//工具类一般不在类上加请求路径
public class UploadController {
    /**
     * 文件自动上传，每一次上传完图片都会走这个请求 ，不是点击确定时间
     * 从redis中移除提交的数据=》鼠标点击确定的时候做=》SetmealController要做的事情
     * 因为每次点击确定的时候只知道当前file对象中的图片是要真实上传的，并不知道之前的每一条图片数具体上传还是改移除
     * 所以只能将每一条图片都走一遍redis和oss，提交的在 SetmealController 从redis移除，剩余的根据过期时间从oss和redis移除
     * 该函数：将每一条图片存入oss的同时，也存入redis
     * 工具类中定义一个统一的删除图片的信息的方法
     * @param file
     * @return
     * @throws IOException
     */
//    @Resource
//    private RedisTemplate<String,Object> redisTemplate;

    @RequestMapping("/upload")
    //@RequestParam("file") MultipartFile file 对应前端传组件中的 name 属性，上传的文件名
    public Result upload(@RequestParam("file") MultipartFile file) throws IOException {
        System.out.println("file = " + file);
        //path:生成的oss上传路径
        //TODO：这里可以不在fileUpload里拿path，先拿到path，再存入数据库，在存入oss=》可以完成自己的想法吗
        String path = UploadUtils.fileUpload(file.getInputStream(), file.getOriginalFilename());
        //文件上传的时候，将文件同时存入redis
        RedisUtil.addToSet("file:allset",path);
        //为每一个value设置一个单独的key=》缓冲24小时，会自动清除
        //redis命令 set key value
        //expire key seconds
//        redisTemplate.opsForValue().set("file:"+path,1,5, TimeUnit.MINUTES);
        RedisUtil.set("file:"+path,1,5, TimeUnit.MINUTES);
        return new Result(path);
    }

    /**
     * 文件上传
     * @param file 接收前端传过来的文件流；MultipartFile：文件流，只能在web层使用，看包名
     * @RequestMapping("/upload"): 请求路径对应前端上传组件中的action属性
     * @return
     * TODO：放入redis的时候不移除提交数据，统一删除所有没有key为path的值
     * TODO：能不能提交数据不走redis？？？
     * TODO：按照我们的想法试试
     * TODO：编辑的时候，可以单独开一个集合存放被替换的图片，这些图片是可以直接删除的=》能不能将添加时添加到oss的图片也认为是提交成功的图片
     *      当我们点掉时，就可以直接删除==》好像不行，=》因为编辑的图片是可以直接删除，不用留缓存时间的，但是还没有提交的数据要留个缓存时间
     */

}
